package top.kaoshanji.p2ch10b;

/**
 * 代码清单-p2ch10b-253页a：工厂方法设计模式
 * author kaoshanji
 * ^_^
 * create time 2025/3/11 10:49
 */
public class Factories {

    // 参数是工厂接口..重点是这是个接口
    // 具体是那种工厂实现，可以根据需要传入，也就意味着会返回对应的产品
    public static void serviceConsumer(ServiceFactory factory) {
        Service s = factory.getService();
        s.method1();
        s.method2();
    }

    public static void main(String[] args) {

        // 第一种工厂实现
        serviceConsumer(new Service1Factory());

        // 服务是完全可以互换的
        // 第二种工厂实现
        serviceConsumer(new Service2Factory());

    }

}

// 产品接口 --> 目标对象
// 可以从工厂对象拿到产品对象，也就是说创建产品对象的过程被工厂接口给屏蔽了
// 选择那种工厂实现，就意味着选择那种产品
interface Service {
    void method1();
    void method2();
}

// 工厂接口 --> 每种工厂实现表示一种创建产品的方式
interface ServiceFactory {
    Service getService();
}

// 一种产品实现
class Service1 implements Service {

    Service1 () {} // 包访问权限

    @Override
    public void method1() {
        System.out.println("Service1 method1");
    }

    @Override
    public void method2() {
        System.out.println("Service1 method2");
    }
}

// 一种工厂实现，创建一种产品
class Service1Factory implements ServiceFactory {

    @Override
    public Service getService() {
        return new Service1();
    }
}

// 一种产品实现
class Service2 implements Service {

    Service2() {}

    @Override
    public void method1() {
        System.out.println("Service2 method1");
    }

    @Override
    public void method2() {
        System.out.println("Service2 method2");
    }
}

// 一种工厂实现
class Service2Factory implements ServiceFactory {

    @Override
    public Service getService() {
        return new Service2();
    }
}

